from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Any, Optional

# 创建 FastAPI 应用实例
app = FastAPI(
    title="FastAPI Response Wrapper",
    description="一个封装了标准响应格式的 FastAPI 应用",
    version="1.0.0"
)

# 定义标准响应模型
class ResponseModel(BaseModel):
    """
    标准响应模型
    
    Attributes:
        msg: 响应消息
        code: 状态码
        data: 响应数据
    """
    msg: str
    code: int
    data: Optional[Any] = None

# 示例接口：返回欢迎信息
@app.get("/", response_model=ResponseModel, summary="根路径")
async def root():
    """
    根路径接口，返回欢迎信息
    """
    return ResponseModel(
        msg="欢迎使用 FastAPI 标准响应格式",
        code=200,
        data={"welcome": "Hello World"}
    )

# 示例接口：获取用户信息
@app.get("/user/{user_id}", response_model=ResponseModel, summary="获取用户信息")
async def get_user(user_id: int):
    """
    根据用户ID获取用户信息
    
    Args:
        user_id: 用户ID
        
    Returns:
        ResponseModel: 用户信息响应
    """
    # 模拟从数据库获取用户信息
    # 如果用户ID为0，则模拟用户不存在的情况
    if user_id == 0:
        return ResponseModel(
            msg="用户不存在",
            code=404,
            data=None
        )
    
    user_data = {
        "id": user_id,
        "name": "张三" if user_id == 1 else "李四",
        "email": "zhangsan@example.com" if user_id == 1 else "lisi@example.com"
    }
    
    return ResponseModel(
        msg="用户信息获取成功",
        code=200,
        data=user_data
    )

# 示例接口：创建用户（POST 请求）
@app.post("/user", response_model=ResponseModel, summary="创建用户")
async def create_user():
    """
    创建新用户
    
    Returns:
        ResponseModel: 创建结果响应
    """
    # 模拟创建用户逻辑
    new_user = {
        "id": 1001,
        "name": "新用户",
        "email": "newuser@example.com"
    }
    
    return ResponseModel(
        msg="用户创建成功",
        code=201,
        data=new_user
    )

# 错误处理示例
@app.get("/error", response_model=ResponseModel, summary="错误处理示例")
async def error_endpoint():
    """
    演示错误处理的示例接口
    """
    return ResponseModel(
        msg="这是一个错误示例",
        code=500,
        data=None
    )

# 带异常处理的接口示例
@app.get("/user-with-exception/{user_id}", response_model=ResponseModel, summary="带异常处理的用户接口")
async def get_user_with_exception(user_id: int):
    """
    演示如何使用 FastAPI 的异常处理机制
    
    Args:
        user_id: 用户ID
        
    Returns:
        ResponseModel: 用户信息响应
        
    Raises:
        HTTPException: 当用户ID为负数时抛出异常
    """
    if user_id < 0:
        raise HTTPException(status_code=400, detail="用户ID不能为负数")
    
    if user_id == 0:
        return ResponseModel(
            msg="用户不存在",
            code=404,
            data=None
        )
    
    user_data = {
        "id": user_id,
        "name": f"用户{user_id}",
        "email": f"user{user_id}@example.com"
    }
    
    return ResponseModel(
        msg="用户信息获取成功",
        code=200,
        data=user_data
    )

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)